package com.edu.exam.entity.exampaper.generation;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 算法配置实体类
 *
 * <p>算法配置表用于存储组卷算法的配置参数，支持多种算法类型的选择参数、质量参数、性能参数等配置管理。
 * 实现算法的灵活配置和参数化调优，支持不同场景下的算法优化。</p>
 *
 * <p>核心功能：
 * - 算法参数配置：存储各种算法的详细参数配置
 * - 算法类型管理：支持多种组卷算法类型
 * - 默认配置管理：支持设置和查询默认配置
 * - 配置激活控制：支持配置的激活和停用管理</p>
 *
 * <p>支持的算法类型：
 * - WEIGHTED_RANDOM：加权随机算法
 * - PURE_RANDOM：纯随机算法
 * - GENETIC_ALGORITHM：遗传算法
 * - SIMULATED_ANNEALING：模拟退火算法
 * - GREEDY_ALGORITHM：贪心算法</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-09
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class AlgorithmConfig {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 配置ID
     *
     * <p>算法配置的唯一标识符，采用UUID格式生成。
     * 用于配置的唯一标识、任务关联和配置管理。</p>
     */
    @Column(name = "config_id", nullable = false, length = 32, unique = true)
    private String configId;

    /**
     * 配置名称
     *
     * <p>算法配置的显示名称，应简洁明了地描述配置的特点和用途。
     * 例如："标准加权随机配置"、"高性能遗传算法配置"等。</p>
     */
    @Column(name = "name", nullable = false, length = 100)
    private String name;

    /**
     * 配置描述
     *
     * <p>算法配置的详细描述，记录配置的适用场景、特点、优化目标等信息。
     * 可选字段，用于丰富配置的说明信息。</p>
     */
    @Column(name = "description", columnDefinition = "TEXT")
    private String description;

    /**
     * 算法类型
     *
     * <p>支持的算法类型标识，用于区分不同的组卷算法。
     * 支持的类型包括：WEIGHTED_RANDOM、PURE_RANDOM、GENETIC_ALGORITHM等。</p>
     */
    @Column(name = "algorithm_type", nullable = false, length = 30)
    private String algorithmType;

    /**
     * 选择参数
     *
     * <p>JSON格式的试题选择参数配置，包含权重设置、选择策略、随机种子等。
     * 用于控制试题选择过程的具体行为。</p>
     */
    @Column(name = "selection_params", columnDefinition = "CLOB")
    private String selectionParams;

    /**
     * 质量参数
     *
     * <p>JSON格式的质量控制参数配置，包含质量阈值、评估指标、优化目标等。
     * 用于控制生成试卷的质量标准。</p>
     */
    @Column(name = "quality_params", columnDefinition = "CLOB")
    private String qualityParams;

    /**
     * 性能参数
     *
     * <p>JSON格式的性能优化参数配置，包含执行时间限制、内存使用限制、并发设置等。
     * 用于控制算法的执行性能和资源使用。</p>
     */
    @Column(name = "performance_params", columnDefinition = "CLOB")
    private String performanceParams;

    /**
     * 是否默认
     *
     * <p>标识是否为算法类型的默认配置。
     * true表示该算法类型的默认配置，false表示普通配置。</p>
     */
    @Column(name = "is_default", nullable = false)
    private Boolean isDefault = false;

    /**
     * 是否激活
     *
     * <p>标识配置是否激活可用。
     * true表示配置激活可用，false表示配置停用。</p>
     */
    @Column(name = "is_active", nullable = false)
    private Boolean isActive = true;

    /**
     * 创建者ID
     *
     * <p>创建配置的用户ID，关联系统用户表。
     * 用于记录配置的责任人和权限控制。</p>
     */
    @Column(name = "creator_id", nullable = false, length = 32)
    private String creatorId;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    // ===== 常量定义 =====

    /** 算法类型 - 加权随机算法 */
    public static final String ALGORITHM_WEIGHTED_RANDOM = "WEIGHTED_RANDOM";

    /** 算法类型 - 纯随机算法 */
    public static final String ALGORITHM_PURE_RANDOM = "PURE_RANDOM";

    /** 算法类型 - 遗传算法 */
    public static final String ALGORITHM_GENETIC_ALGORITHM = "GENETIC_ALGORITHM";

    /** 算法类型 - 模拟退火算法 */
    public static final String ALGORITHM_SIMULATED_ANNEALING = "SIMULATED_ANNEALING";

    /** 算法类型 - 贪心算法 */
    public static final String ALGORITHM_GREEDY_ALGORITHM = "GREEDY_ALGORITHM";

}
